home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Future Workshop
/
Future Workshop.iso
/
multimed
/
qtw111
/
mplayer
/
common.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-01-11
|
13KB
|
413 lines
// ---------------------------------------------------------------------
//
// Common.c - Common Routines - QuickTime for Windows
//
// Version 1.0
//
// (c) 1988-1992 Apple Computer, Inc. All Rights Reserved.
//
// ---------------------------------------------------------------------
// Includes
// --------
#include <Windows.H> // Required by Windows
#include <WindowsX.H> // Required by Windows
#include <dos.h> // Standard "C" header
#include <errno.h> // Standard "C" header
#include <stdarg.h> // Standard "C" header
#include <stdlib.h> // Standard "C" header
#include <stdio.h> // Standard "C" header
#include "Common.H" // Interface to Common.C
// Globals
// -------
static struct
{char szOutOfMemory[COMMON_STRING_MAX]; // Out of memory message
WORD idNoMemMsg; // Non memory message id
} g;
// Region Code Table
// --------------------------------------------------------------------
// Ordinal position represents corresponding Mac region code
// --------------------------------------------------------------------
static char* pszRegion[] = {
"enu", // 0
"fra", // 1
"eng", // 2
"deu", // 3
"ita", // 4
"nld", // 5
"fra", // 6
"sve", // 7
"esn", // 8
"dan", // 9
"ptg", // 10
"frc", // 11
"nor", // 12
"---", // 13
"---", // 14
"eng", // 15
"---", // 16
"fin", // 17
"fra", // 18
"deu", // 19
"---", // 20
"isl", // 21
"" // Last entry must be NULL
};
// Function: CommonAlloc - Allocate memory
// --------------------------------------------------------------------
// Parameters: LONG lBytes; /* Number of bytes to allocate */
//
// Returns: VOID FAR *pvMemory; /* Memory block */
// --------------------------------------------------------------------
VOID FAR * FAR CommonAlloc (LONG lBytes)
// Perform simple allocation for now
{
HGLOBAL hmem; // Memory handle
if( hmem = GlobalAlloc( GHND, (DWORD) lBytes ))
return GlobalLock( hmem );
else
return NULL;
}
// Function: CommonFormatMessage - Format Message
// --------------------------------------------------------------------
// Parameters: HINSTANCE hResources; /* Resource-only DLL handle */
// WORD idMsg; /* ID of message in resource file */
// LPSTR lpszMsg; /* Area in which to build message */
//
// Returns: LPSTR lpszMsg;
// --------------------------------------------------------------------
LPSTR FAR CommonFormatMessage
(HINSTANCE hResources, WORD idMsg, LPSTR lpszMsg, ...)
// Define function data
{
char szFormat[COMMON_STRING_MAX]; // Message format
va_list pArgs; // String substitution arguments
// Load the message string
LoadString (hResources, idMsg, szFormat, sizeof (szFormat));
// Build the message text
va_start (pArgs, lpszMsg);
wvsprintf (lpszMsg, szFormat, (LPSTR) pArgs);
va_end (pArgs);
// Return to caller
return lpszMsg;
}
// Function: CommonFree - Free memory allocated by CommonAlloc
// --------------------------------------------------------------------
// Parameters: VOID FAR *pvMemory; /* Memory to free */
//
// Returns: None
// --------------------------------------------------------------------
VOID FAR CommonFree (VOID FAR *pvMemory)
// Perform simple free for now
{
HGLOBAL hmem; //Memory handle
if( hmem = (HGLOBAL) LOWORD( GlobalHandle( SELECTOROF( pvMemory )))) {
GlobalUnlock( hmem );
GlobalFree( hmem );
}
return;
}
// Function: CommonGetDirectoryOfModule - Get Path of Module
// --------------------------------------------------------------------
// Parameters: HINSTANCE hInstance; /* Application's instance handle */
// LPSTR lpPath; /* pointer to path buffer */
// Returns: LPSTR lpPath;
// --------------------------------------------------------------------
LPSTR FAR CommonGetDirectoryOfModule (HINSTANCE hInstance, LPSTR lpPath)
{
char szBuffer[CCHMAXPATH]; // Temporary buffer
LPSTR lpszTemp; // Temporary pointer
// Clear the buffer
szBuffer[0] = '\0';
// Get the fully qualified .EXE name
if (!GetModuleFileName (hInstance, szBuffer, sizeof (szBuffer)))
return (LPSTR) NULL;
// Look backwards until we find the last backslash
lpszTemp = szBuffer + lstrlen(szBuffer);
while ((lpszTemp > szBuffer) && (*lpszTemp != '\\'))
lpszTemp = AnsiPrev (szBuffer, lpszTemp);
if (*lpszTemp != '\\')
return (LPSTR) NULL;
// We delete the last backslash; we now have the path specification
*lpszTemp = '\0';
lstrcpy (lpPath, AnsiUpper (szBuffer));
// Return to caller
return lpPath;
}
// Function: CommonGetLocalizedHelpFile - Get Help File Name
// --------------------------------------------------------------------
// Parameters: LPSTR lpszAppl; /* Application's root name */
// LPSTR lpszName; /* Area in which to build name */
// HINSTANCE hInstance; /* Application's instance handle */
//
// Returns: LPSTR pszName;
// --------------------------------------------------------------------
LPSTR FAR CommonGetLocalizedHelpFile
(LPSTR lpszAppl, LPSTR lpszName, HINSTANCE hInstance)
// Define function data
{
char szBuffer[CCHMAXPATH]; // Temporary buffer
char szApplDir[CCHMAXPATH]; // Application's directory
char szLanguage[4]; // Language code
struct _find_t fileinfo; // Temp file info
// Clear the area in which the name will be built
lpszName[0] = '\0';
// Get the application's directory
if (!CommonGetDirectoryOfModule (hInstance, (LPSTR) szApplDir))
return lpszName;
// Look for the localized help file in the ..\HELP directory
GetProfileString( "intl", "sLanguage", "enu", szLanguage, sizeof(szLanguage));
wsprintf( szBuffer, "%s\\..\\help\\%s%s.hlp",
(LPSTR) szApplDir, (LPSTR) lpszAppl, (LPSTR) szLanguage );
if (_dos_findfirst (szBuffer, _A_NORMAL, &fileinfo) == 0) {
lstrcpy (lpszName, AnsiUpper (szBuffer));
return lpszName;
}
// If it can't be found, look for the localized help
// file in the application's directory
wsprintf( szBuffer, "%s\\%s%s.hlp",
(LPSTR) szApplDir, (LPSTR) lpszAppl, (LPSTR) szLanguage );
if (_dos_findfirst (szBuffer, _A_NORMAL, &fileinfo) == 0) {
lstrcpy (lpszName, AnsiUpper (szBuffer));
return lpszName;
}
// If it can't be found, look for the US English help
// file in the ..\HELP directory
wsprintf( szBuffer, "%s\\..\\help\\%senu.hlp",
(LPSTR) szApplDir, (LPSTR) lpszAppl );
if (_dos_findfirst (szBuffer, _A_NORMAL, &fileinfo) == 0) {
lstrcpy (lpszName, AnsiUpper (szBuffer));
return lpszName;
}
// If it can't be found, look for the US English help
// file in the application's directory
wsprintf( szBuffer, "%s\\%senu.hlp", (LPSTR) szApplDir, (LPSTR) lpszAppl );
if (_dos_findfirst (szBuffer, _A_NORMAL, &fileinfo) == 0) {
lstrcpy (lpszName, AnsiUpper (szBuffer));
return lpszName;
}
// Otherwise, return NULL to the caller
return lpszName;
}
// Function: CommonGetLocalizedResources - Load Resource-Only DLL
// --------------------------------------------------------------------
// Parameters: LPSTR lpszAppl; Application's root name
// HINSTANCE hInstance; Application's instance handle
// WORD idNoMemMsg; id of no memory message
//
// Returns: HINSTANCE hResource; handle to resource instance
// --------------------------------------------------------------------
HINSTANCE FAR CommonGetLocalizedResources
(LPSTR lpszAppl, HINSTANCE hInstance, WORD idNoMemMsg )
// Define function data
{
char szBuffer[CCHMAXPATH]; // Temporary buffer
char szLanguage[4]; // Language code
LPSTR lpszSave; // Temporary pointer
HINSTANCE hResources; // Resource handle
// Suppress DLL load warnings
SetErrorMode (SEM_NOOPENFILEERRORBOX);
// Get the application path
if (!CommonGetDirectoryOfModule (hInstance, (LPSTR) szBuffer))
return NULL;
// Build the name of the resource-only DLL
lstrcat (szBuffer, "\\");
lstrcat (szBuffer, lpszAppl);
lpszSave = szBuffer + lstrlen(szBuffer);
GetProfileString ("intl", "sLanguage", "enu", szLanguage, sizeof (szLanguage));
lstrcat (szBuffer, szLanguage);
lstrcat (szBuffer, ".dll");
AnsiUpper (szBuffer);
// Load the resource-only DLL. If it can't be found, use the US
// English DLL. If it can't be found, we'll use the original .EXE
// resources
if ((hResources = LoadLibrary (szBuffer)) == 0)
return NULL;
else if (hResources < (HINSTANCE) 32) {
lstrcpy (lpszSave, "enu");
lstrcat (lpszSave, ".dll");
AnsiUpper (szBuffer);
if ((hResources = LoadLibrary (szBuffer)) == 0)
return NULL;
if (hResources < (HINSTANCE) 32)
hResources = hInstance;
}
// Load the out of memory message
if (idNoMemMsg > 0) {
LoadString (hResources, idNoMemMsg, g.szOutOfMemory, sizeof (g.szOutOfMemory));
g.idNoMemMsg = idNoMemMsg;
}
// Return to the caller
return hResources;
}
// Function: CommonGetCurrentRegion - Get Region Code for Current Language
// --------------------------------------------------------------------
// Parameters: none
//
// Returns: UINT uiRegion; Mac region code corresponding
// to current Windows language code
// --------------------------------------------------------------------
UINT FAR CommonGetCurrentRegion (VOID)
// Define function data
{
char szLanguage[4]; // Language code
UINT uiRegion; // Region code
// Match Windows language code to Mac region code
GetProfileString( "intl", "sLanguage", "enu", szLanguage, sizeof(szLanguage));
for (uiRegion = 0; *pszRegion[uiRegion]; uiRegion++)
if (lstrcmpi (szLanguage, pszRegion[uiRegion]) == 0)
break;
// Return to the caller
return (*pszRegion[uiRegion])? uiRegion : 0;
}
// Function: CommonTellUser - Issue message to User
// --------------------------------------------------------------------
// Parameters: HINSTANCE hResources; /* Recource-only DLL handle */
// WORD idMsg; /* ID of message in resource DLL */
// WORD idCaption; /* ID of caption in resource DLL */
// WORD idStyle /* MessageBox style flags */
//
// Returns: int idReply; /* MessageBox reply flags */
// --------------------------------------------------------------------
int FAR CommonTellUser
(HINSTANCE hResources, WORD idMsg, WORD idCaption, WORD idStyle, ...)
// Define function data
{
char szFormat[COMMON_STRING_MAX]; // Message format
char szBuffer[COMMON_STRING_MAX]; // Message buffer
char szCaption[COMMON_STRING_MAX]; // Message caption
WORD idReply; // Message response
va_list pArgs; // String substitution arguments
// check for out of memory id
if (g.idNoMemMsg == idMsg) {
idReply = MessageBox (NULL, g.szOutOfMemory, NULL, MB_OK | MB_SYSTEMMODAL | MB_ICONHAND );
goto endTellUser;
}
// Load the caption string
LoadString (hResources, idCaption, szCaption, sizeof (szCaption));
// Load the message string
LoadString (hResources, idMsg, szFormat, sizeof (szFormat));
// Build the message text
va_start (pArgs, idStyle);
wvsprintf (szBuffer, szFormat, (LPSTR) pArgs);
va_end (pArgs);
// Display the message and capture response
idReply = MessageBox (NULL, szBuffer, szCaption, idStyle);
// Terminate if abort was requested
endTellUser:
if (idReply == IDABORT)
abort ();
// Return reply
return idReply;
}